package com.zzl.mine.tool;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

/**
 * @description JSON工具类（com.alibaba.fastjson）
 * @author rambo
 * @date 2018年5月23日 上午11:11:51
 */
public class JSONUtil {

	/**
	 * @description 生成JSONObject字符串(有且只有一个键值对)
	 * @param key
	 * @param value
	 * @return
	 */
	public static String generateJsonObjectString(String key, Object value){
		if(StringUtils.isNotBlank(key)){
			JSONObject jsonObject = new JSONObject();
			jsonObject.put(key,value);
			return jsonObject.toString();
		}
		return "";
	}

	/**
	 * @description Map转JSONObject字符串
	 * @param map
	 * @return
	 */
	public static String map2JsonObjectString(Map<String,Object> map){
		if(map != null){
			JSONObject jsonObject = new JSONObject();

			//方法一：该方法比较好
			/*for (Map.Entry<String, Object> entry : map.entrySet()) {
				jsonObject.put(entry.getKey(), entry.getValue());
			}*/

			//方法二：
			Iterator<Map.Entry<String,Object>> iterator = map.entrySet().iterator();
			while(iterator.hasNext()){
				Map.Entry<String,Object> entry = iterator.next();
				jsonObject.put(entry.getKey(),entry.getValue());
			}
			return jsonObject.toString();
		}
		return "";
	}

	/**
	 * @description mapList转JSONArray字符串
	 * @param mapList
	 * @return
	 */
	public static String mapList2JsonArrayString(List<Map<String,Object>> mapList){
		if(mapList != null){
			return convertMapList2JsonArray(mapList,new JSONArray()).toString();
		}
		return "";
	}

	/**
	 * @description JSONObject字符串转Map
	 * @param jsonObjectString
	 * @return
	 */
	public static Map<String, Object> jsonObjectString2Map(String jsonObjectString){
		return JSON.parseObject(jsonObjectString, new TypeReference<Map<String, Object>>(){});
	}

	/**
	 * @description JSONArray字符串转mapList
	 * @param jsonArrayString
	 * @return
	 */
	public static List<Map<String, Object>> jsonArrayString2MapList(String jsonArrayString){
		return JSON.parseObject(jsonArrayString, new TypeReference<List<Map<String, Object>>>(){});
	}

	/**
	 * @description Map转JSONObject
	 * @param map
	 * @return
	 */
	public static JSONObject map2JsonObject(Map<String,Object> map){
		if(map != null){
			JSONObject jsonObject = new JSONObject();
			Iterator<Map.Entry<String,Object>> iterator = map.entrySet().iterator();
			while(iterator.hasNext()){
				Map.Entry<String,Object> entry = iterator.next();
				jsonObject.put(entry.getKey(),entry.getValue());
			}
			return jsonObject;
		}
		return null;
	}

	/**
	 * @description mapList转JSONArray
	 * @param mapList
	 * @return
	 */
	public static JSONArray mapList2JsonArray(List<Map<String,Object>> mapList){
		if(mapList != null){
			return convertMapList2JsonArray(mapList,new JSONArray());
		}
		return null;
	}

	/**
	 * @description JSONObject转Map
	 * @return
	 */
	public static Map<String, Object> jsonObject2Map(JSONObject jsonObject){
		if(jsonObject != null){
			Map<String, Object> map = new HashMap<String, Object>();

			//方法一：该方法比较好
			/*for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
				map.put(entry.getKey(), entry.getValue());
			}*/

			//方法二：
			Iterator<Map.Entry<String,Object>> iterator = jsonObject.entrySet().iterator();
			while(iterator.hasNext()){
				Map.Entry<String,Object> entry = iterator.next();
				map.put(entry.getKey(),entry.getValue());
			}
			return map;
		}
		return null;
	}

	/**
	 * @description JSONArray转mapList
	 * @return
	 */
	public static List<Map<String, Object>> jsonArray2MapList(JSONArray jsonArray){
		if(jsonArray != null){
			List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
			for(Object object : jsonArray){
				JSONObject jsonObject = (JSONObject) object;
				Map<String, Object> map = new HashMap<String, Object>();
				Iterator<Map.Entry<String,Object>> iterator = jsonObject.entrySet().iterator();
				while(iterator.hasNext()){
					Map.Entry<String,Object> entry = iterator.next();
					map.put(entry.getKey(),entry.getValue());
				}
				mapList.add(map);
			}
			return mapList;
		}
		return null;
	}

	/**
	 * @description JSONObject字符串转JSONObject
	 * @param JsonObject
	 * @return
	 */
	public static JSONObject jsonObjectString2JsonObject(String JsonObject){
		JSONObject result = null;
		if(StringUtils.isBlank(JsonObject)){
			return result;
		}
		try {
			return JSON.parseObject(JsonObject);
		} catch (Exception e) {
			return result;
		}
	}

	/**
	 * @description JSONArray字符串转JSONArray
	 * @param JsonArray
	 * @return
	 */
	public static JSONArray jsonArrayString2JsonArray(String JsonArray){
		JSONArray result = null;
		if(StringUtils.isBlank(JsonArray)){
			return result;
		}
		try {
			return JSON.parseArray(JsonArray);
		} catch (Exception e) {
			return result;
		}
	}

	//**************************************************************************************//

	/**
	 * @description JSONObject字符串转javaBean对象
	 * @param jsonObjectString
	 * @param clazz
	 * @param <T>
	 * @return
	 */
	public static <T> T jsonObjectString2JavaBean(String jsonObjectString, Class<T> clazz){
		return JSON.parseObject(jsonObjectString,clazz);
	}

	/**
	 * @description JSONArray字符串转javaBean的List集合
	 * @param jsonArrayString
	 * @param clazz
	 * @param <T>
	 * @return
	 */
	public static <T> List<T> jsonArrayString2JavaBeanList(String jsonArrayString, Class<T> clazz){
		return JSON.parseArray(jsonArrayString,clazz);
	}

	/**
	 * @description javaBean对象转JSONObject字符串
	 * @param javaBean
	 * @param isFormat 是否进行格式化：true进行格式化，false不进行格式化，null不进行格式化同false
	 * @return
	 */
	public static String javaBean2JsonObjectString(Object javaBean, Boolean isFormat){
		if(isFormat != null){
			return JSON.toJSONString(javaBean,isFormat);
		}
		return JSON.toJSONString(javaBean);
	}

	/**
	 * @description javaBean的List集合转JSONArray字符串
	 * @param javaBeanList
	 * @param isFormat 是否进行格式化：true进行格式化，false不进行格式化，null不进行格式化同false
	 * @param <T>
	 * @return
	 */
	public static <T> String javaBeanList2JsonArrayString(List<T> javaBeanList, Boolean isFormat){
		if(isFormat != null){
			return JSON.toJSONString(javaBeanList,isFormat);
		}
		return JSON.toJSONString(javaBeanList);
	}

	/**
	 * @description javaBean转JSONObject，其实相当于已经转为了JSONObject字符串（toString）
	 * @param javaBean
	 * @return
	 */
	public static JSONObject javaBean2JsonObject(Object javaBean){
		return (JSONObject) JSON.toJSON(javaBean);
	}

	/**
	 * @description javaBean的List转JSONArray，其实相当于已经转为了JSONArray字符串（toString）
	 * @param javaBeanList
	 * @param <T>
	 * @return
	 */
	public static <T> JSONArray javaBeanList2JsonArray(List<T> javaBeanList){
		return (JSONArray) JSON.toJSON(javaBeanList);
	}

	//**************************************************************************************//

	/**
	 * @description JSON字符串转JSON，可能是JSONObject，也可能是JSONArray
	 * @param jsonString
	 * @return
	 */
	public static Object jsonString2Json(String jsonString){
		return JSON.parse(jsonString);
	}

	/**
	 * @description map转JSONString
	 * @param mapOrMapList
	 * @return 如果参数是Map，那么返回值就是JSONObject字符串；如果参数是List<Map>，那么返回值就是JSONArray字符串。
	 */
	public static String map2JsonString(Object mapOrMapList){
		return JSON.toJSONString(mapOrMapList);
	}

	/**
	 * @description MapList 转 JsonArray
	 * @param mapList
	 * @param jsonArray
	 * @return
	 */
	private static JSONArray convertMapList2JsonArray(List<Map<String,Object>> mapList, JSONArray jsonArray){
		for(Map<String,Object> map : mapList){
			JSONObject jsonObject = new JSONObject();
			Iterator<Map.Entry<String,Object>> iterator = map.entrySet().iterator();
			while(iterator.hasNext()){
				Map.Entry<String,Object> entry = iterator.next();
				jsonObject.put(entry.getKey(),entry.getValue());
			}
			jsonArray.add(jsonObject);
		}
		return jsonArray;
	}

}
